import 'dart:typed_data';

import 'package:bluetooth_protocols_plugin/src/base/message/message_base.dart';

// 公共指令基类
abstract class PublicInstructionMessageBase<T extends MessageBase> {
  // SN - 用于Lorin
  T get getSnIntrMsg;

  // 产品模型 - 用于Lorin
  T get getProductModelIntrMsg;

  // 固件版本
  T getFirmwareVersionIntrMsg({int? targetDevice});

  // 检测安全连接结果
  T get checkSafeConnectionResultIntrMsg;

  // 建立安全连接
  T establishSafeConnectionIntrMsg(Uint8List bytes);

  /// 查询固件升级状态
  T queryFirmwareUpdateStatusIntrMsg(int targetDevice);

  /// 开始固件升级
  T startFirmwareUpdateIntrMsg(int targetDevice, {bool isStart = true});

  /// 查询强制固件升级状态
  T queryForceFirmwareUpdateStatusIntrMsg({int? targetDevice});

  /// 清除固件升级状态
  T clearFirmwareUpdateStatusIntrMsg(
    int forceUpgradeStatus,
    int lowVersion,
    int highVersion, {
    int? targetDevice,
  });

  /// 开始强制固件升级
  /// [type] 强制升级类型
  /// [lowVersion] 低版本号
  /// [highVersion] 高版本号
  /// 最低版本号不大于最高版本号，最低版本号不得为 0xFFFFFFFF
  T startForceFirmwareUpdateIntrMsg(
    int targetDevice,
    int forceUpgradeStatus,
    int lowVersion,
    int highVersion,
  );

  /// 打开文件
  /// [type] 文件打开方式
  /// [path] 文件路径
  T openFileIntrMsg(int targetDevice, int openFileType, String path);

  /// 读写文件
  /// [handle] 文件句柄
  /// [offset] 偏移位置
  /// [length] 读取长度，写入时该参数无效
  /// [data] 写入数据，读取时该参数无效
  T readWriteFileIntrMsg(
    int targetDevice,
    int handle,
    int offset, {
    int? length,
    Uint8List? data,
  });

  /// 校验文件
  /// [handle] 文件句柄
  /// [offset] 偏移位置
  /// [fileSize] 文件大小（写入时使用）
  /// [crc32] CRC32校验值（写入时使用）
  T verifyFileIntrMsg(int targetDevice, int handle, int offset,
      {int? fileSize, int? crc32});

  /// 关闭文件（终止下载）
  /// [handle] 文件句柄
  T closeFileIntrMsg(int targetDevice, int handle);

  /// 读取文件信息
  /// [path] 文件路径
  T readFileInfoIntrMsg(int targetDevice, String path);

  /// 删除文件
  /// [path] 文件路径
  T deleteFileIntrMsg(int targetDevice, String path);

  /// 重命名文件
  /// [oldPath] 旧文件路径
  /// [newPath] 新文件路径
  T renameFileIntrMsg(int targetDevice, String oldPath, String newPath);

  /// 获取文件列表
  /*
    请求序号必须从 0 开始，从机收到请求序号 0，应重新对文件进行遍历，并重置剩余文件数目，过滤控制字符串为可选字段，只有请求序号为 0 时允许存在
  */
  /// [index] 请求序号
  /// [method] 遍历方式
  /// [depth] 遍历深度
  /// [path] 目录路径
  /// [name] 文件名过滤
  T getFileListIntrMsg(
    int targetDevice,
    int index,
    int method,
    int depth,
    String path,
    String name,
  );
}
